{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cognitive-socket",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torchvision\n",
    "from torch.utils.data import DataLoader\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 超参数\n",
    "n_epochs = 3\n",
    "batch_size_train = 64\n",
    "batch_size_test = 1000\n",
    "learning_rate = 0.01\n",
    "momentum = 0.5\n",
    "log_interval = 10\n",
    "random_seed = 1\n",
    "torch.manual_seed(random_seed)\n",
    "\n",
    "train_loader = torch.utils.data.DataLoader(\n",
    "    torchvision.datasets.MNIST('./data/', train=True, download=True,\n",
    "                             transform=torchvision.transforms.Compose([\n",
    "                               torchvision.transforms.ToTensor(),\n",
    "                               torchvision.transforms.Normalize(\n",
    "                                 (0.1307,), (0.3081,))\n",
    "                             ])),\n",
    "    batch_size=batch_size_train, shuffle=True)\n",
    "test_loader = torch.utils.data.DataLoader(\n",
    "     torchvision.datasets.MNIST('./data/', train=False, download=True,\n",
    "                             transform=torchvision.transforms.Compose([\n",
    "                               torchvision.transforms.ToTensor(),\n",
    "                               torchvision.transforms.Normalize(\n",
    "                                 (0.1307,), (0.3081,))\n",
    "                             ])),\n",
    "    batch_size=batch_size_test, shuffle=True)\n",
    "\n",
    "examples = enumerate(test_loader)\n",
    "batch_idx, (example_data, example_targets) = next(examples)\n",
    "# print(example_targets)\n",
    "# print(example_data.shape)\n",
    "fig = plt.figure()\n",
    "for i in range(6):\n",
    "  plt.subplot(2,3,i+1)\n",
    "  plt.tight_layout()\n",
    "  plt.imshow(example_data[i][0], cmap='gray', interpolation='none')\n",
    "  plt.title(\"Ground Truth: {}\".format(example_targets[i]))\n",
    "  plt.xticks([])\n",
    "  plt.yticks([])\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "naked-helen",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([32, 1, 28, 28])\n"
     ]
    }
   ],
   "source": [
    "for batch_idx, (data, target) in enumerate(train_loader):\n",
    "    print(data.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "portuguese-happening",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\chenda\\.conda\\envs\\pytorch\\lib\\site-packages\\torch\\nn\\functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at  ..\\c10/core/TensorImpl.h:1156.)\n",
      "  return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)\n",
      "<ipython-input-3-75b4aeed1175>:20: UserWarning: Implicit dimension choice for log_softmax has been deprecated. Change the call to include dim=X as an argument.\n",
      "  return F.log_softmax(x)\n",
      "C:\\Users\\chenda\\.conda\\envs\\pytorch\\lib\\site-packages\\torch\\nn\\_reduction.py:42: UserWarning: size_average and reduce args will be deprecated, please use reduction='sum' instead.\n",
      "  warnings.warn(warning.format(ret))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Test set: Avg. loss: 2.3210, Accuracy: 1038/10000 (10%)\n",
      "\n",
      "Train Epoch: 1 [0/60000 (0%)]\tLoss: 2.303277\n",
      "Train Epoch: 1 [640/60000 (1%)]\tLoss: 2.319504\n",
      "Train Epoch: 1 [1280/60000 (2%)]\tLoss: 2.329208\n",
      "Train Epoch: 1 [1920/60000 (3%)]\tLoss: 2.280451\n",
      "Train Epoch: 1 [2560/60000 (4%)]\tLoss: 2.271921\n",
      "Train Epoch: 1 [3200/60000 (5%)]\tLoss: 2.227678\n",
      "Train Epoch: 1 [3840/60000 (6%)]\tLoss: 2.224929\n",
      "Train Epoch: 1 [4480/60000 (7%)]\tLoss: 2.206246\n",
      "Train Epoch: 1 [5120/60000 (9%)]\tLoss: 2.230011\n",
      "Train Epoch: 1 [5760/60000 (10%)]\tLoss: 2.151048\n",
      "Train Epoch: 1 [6400/60000 (11%)]\tLoss: 1.957810\n",
      "Train Epoch: 1 [7040/60000 (12%)]\tLoss: 2.067621\n",
      "Train Epoch: 1 [7680/60000 (13%)]\tLoss: 1.974498\n",
      "Train Epoch: 1 [8320/60000 (14%)]\tLoss: 1.967260\n",
      "Train Epoch: 1 [8960/60000 (15%)]\tLoss: 1.737180\n",
      "Train Epoch: 1 [9600/60000 (16%)]\tLoss: 1.537309\n",
      "Train Epoch: 1 [10240/60000 (17%)]\tLoss: 1.757748\n",
      "Train Epoch: 1 [10880/60000 (18%)]\tLoss: 1.495717\n",
      "Train Epoch: 1 [11520/60000 (19%)]\tLoss: 1.506882\n",
      "Train Epoch: 1 [12160/60000 (20%)]\tLoss: 1.440240\n",
      "Train Epoch: 1 [12800/60000 (21%)]\tLoss: 1.328003\n",
      "Train Epoch: 1 [13440/60000 (22%)]\tLoss: 1.137985\n",
      "Train Epoch: 1 [14080/60000 (23%)]\tLoss: 1.213733\n",
      "Train Epoch: 1 [14720/60000 (25%)]\tLoss: 1.013922\n",
      "Train Epoch: 1 [15360/60000 (26%)]\tLoss: 1.089218\n",
      "Train Epoch: 1 [16000/60000 (27%)]\tLoss: 0.983562\n",
      "Train Epoch: 1 [16640/60000 (28%)]\tLoss: 1.000804\n",
      "Train Epoch: 1 [17280/60000 (29%)]\tLoss: 1.059806\n",
      "Train Epoch: 1 [17920/60000 (30%)]\tLoss: 1.095796\n",
      "Train Epoch: 1 [18560/60000 (31%)]\tLoss: 0.681890\n",
      "Train Epoch: 1 [19200/60000 (32%)]\tLoss: 1.228998\n",
      "Train Epoch: 1 [19840/60000 (33%)]\tLoss: 0.892533\n",
      "Train Epoch: 1 [20480/60000 (34%)]\tLoss: 0.915407\n",
      "Train Epoch: 1 [21120/60000 (35%)]\tLoss: 0.752148\n",
      "Train Epoch: 1 [21760/60000 (36%)]\tLoss: 0.767354\n",
      "Train Epoch: 1 [22400/60000 (37%)]\tLoss: 0.767314\n",
      "Train Epoch: 1 [23040/60000 (38%)]\tLoss: 0.714449\n",
      "Train Epoch: 1 [23680/60000 (39%)]\tLoss: 0.683070\n",
      "Train Epoch: 1 [24320/60000 (41%)]\tLoss: 0.995357\n",
      "Train Epoch: 1 [24960/60000 (42%)]\tLoss: 0.864940\n",
      "Train Epoch: 1 [25600/60000 (43%)]\tLoss: 0.919113\n",
      "Train Epoch: 1 [26240/60000 (44%)]\tLoss: 0.677081\n",
      "Train Epoch: 1 [26880/60000 (45%)]\tLoss: 0.746798\n",
      "Train Epoch: 1 [27520/60000 (46%)]\tLoss: 0.850748\n",
      "Train Epoch: 1 [28160/60000 (47%)]\tLoss: 0.560005\n",
      "Train Epoch: 1 [28800/60000 (48%)]\tLoss: 0.595582\n",
      "Train Epoch: 1 [29440/60000 (49%)]\tLoss: 0.602372\n",
      "Train Epoch: 1 [30080/60000 (50%)]\tLoss: 0.960629\n",
      "Train Epoch: 1 [30720/60000 (51%)]\tLoss: 0.722920\n",
      "Train Epoch: 1 [31360/60000 (52%)]\tLoss: 0.602066\n",
      "Train Epoch: 1 [32000/60000 (53%)]\tLoss: 0.612475\n",
      "Train Epoch: 1 [32640/60000 (54%)]\tLoss: 0.740034\n",
      "Train Epoch: 1 [33280/60000 (55%)]\tLoss: 0.778563\n",
      "Train Epoch: 1 [33920/60000 (57%)]\tLoss: 0.589007\n",
      "Train Epoch: 1 [34560/60000 (58%)]\tLoss: 0.690505\n",
      "Train Epoch: 1 [35200/60000 (59%)]\tLoss: 0.837973\n",
      "Train Epoch: 1 [35840/60000 (60%)]\tLoss: 0.392166\n",
      "Train Epoch: 1 [36480/60000 (61%)]\tLoss: 0.509890\n",
      "Train Epoch: 1 [37120/60000 (62%)]\tLoss: 0.615470\n",
      "Train Epoch: 1 [37760/60000 (63%)]\tLoss: 0.527913\n",
      "Train Epoch: 1 [38400/60000 (64%)]\tLoss: 0.458243\n",
      "Train Epoch: 1 [39040/60000 (65%)]\tLoss: 0.568238\n",
      "Train Epoch: 1 [39680/60000 (66%)]\tLoss: 0.537643\n",
      "Train Epoch: 1 [40320/60000 (67%)]\tLoss: 0.694802\n",
      "Train Epoch: 1 [40960/60000 (68%)]\tLoss: 0.805666\n",
      "Train Epoch: 1 [41600/60000 (69%)]\tLoss: 0.663598\n",
      "Train Epoch: 1 [42240/60000 (70%)]\tLoss: 0.548843\n",
      "Train Epoch: 1 [42880/60000 (71%)]\tLoss: 0.613300\n",
      "Train Epoch: 1 [43520/60000 (72%)]\tLoss: 0.603340\n",
      "Train Epoch: 1 [44160/60000 (74%)]\tLoss: 0.371564\n",
      "Train Epoch: 1 [44800/60000 (75%)]\tLoss: 0.661110\n",
      "Train Epoch: 1 [45440/60000 (76%)]\tLoss: 0.592791\n",
      "Train Epoch: 1 [46080/60000 (77%)]\tLoss: 0.599012\n",
      "Train Epoch: 1 [46720/60000 (78%)]\tLoss: 0.597639\n",
      "Train Epoch: 1 [47360/60000 (79%)]\tLoss: 0.394271\n",
      "Train Epoch: 1 [48000/60000 (80%)]\tLoss: 1.002978\n",
      "Train Epoch: 1 [48640/60000 (81%)]\tLoss: 0.525408\n",
      "Train Epoch: 1 [49280/60000 (82%)]\tLoss: 0.399162\n",
      "Train Epoch: 1 [49920/60000 (83%)]\tLoss: 0.497908\n",
      "Train Epoch: 1 [50560/60000 (84%)]\tLoss: 0.538597\n",
      "Train Epoch: 1 [51200/60000 (85%)]\tLoss: 0.575245\n",
      "Train Epoch: 1 [51840/60000 (86%)]\tLoss: 0.606392\n",
      "Train Epoch: 1 [52480/60000 (87%)]\tLoss: 0.514912\n",
      "Train Epoch: 1 [53120/60000 (88%)]\tLoss: 0.336115\n",
      "Train Epoch: 1 [53760/60000 (90%)]\tLoss: 0.339827\n",
      "Train Epoch: 1 [54400/60000 (91%)]\tLoss: 0.386399\n",
      "Train Epoch: 1 [55040/60000 (92%)]\tLoss: 0.460017\n",
      "Train Epoch: 1 [55680/60000 (93%)]\tLoss: 0.555434\n",
      "Train Epoch: 1 [56320/60000 (94%)]\tLoss: 0.554591\n",
      "Train Epoch: 1 [56960/60000 (95%)]\tLoss: 0.432850\n",
      "Train Epoch: 1 [57600/60000 (96%)]\tLoss: 0.631362\n",
      "Train Epoch: 1 [58240/60000 (97%)]\tLoss: 0.397132\n",
      "Train Epoch: 1 [58880/60000 (98%)]\tLoss: 0.304140\n",
      "Train Epoch: 1 [59520/60000 (99%)]\tLoss: 0.473255\n",
      "\n",
      "Test set: Avg. loss: 0.1890, Accuracy: 9444/10000 (94%)\n",
      "\n",
      "Train Epoch: 2 [0/60000 (0%)]\tLoss: 0.426499\n",
      "Train Epoch: 2 [640/60000 (1%)]\tLoss: 0.387389\n",
      "Train Epoch: 2 [1280/60000 (2%)]\tLoss: 0.457583\n",
      "Train Epoch: 2 [1920/60000 (3%)]\tLoss: 0.415467\n",
      "Train Epoch: 2 [2560/60000 (4%)]\tLoss: 0.429001\n",
      "Train Epoch: 2 [3200/60000 (5%)]\tLoss: 0.399600\n",
      "Train Epoch: 2 [3840/60000 (6%)]\tLoss: 0.593777\n",
      "Train Epoch: 2 [4480/60000 (7%)]\tLoss: 0.480460\n",
      "Train Epoch: 2 [5120/60000 (9%)]\tLoss: 0.682638\n",
      "Train Epoch: 2 [5760/60000 (10%)]\tLoss: 0.367382\n",
      "Train Epoch: 2 [6400/60000 (11%)]\tLoss: 0.477577\n",
      "Train Epoch: 2 [7040/60000 (12%)]\tLoss: 0.604199\n",
      "Train Epoch: 2 [7680/60000 (13%)]\tLoss: 0.290812\n",
      "Train Epoch: 2 [8320/60000 (14%)]\tLoss: 0.492491\n",
      "Train Epoch: 2 [8960/60000 (15%)]\tLoss: 0.589223\n",
      "Train Epoch: 2 [9600/60000 (16%)]\tLoss: 0.588145\n",
      "Train Epoch: 2 [10240/60000 (17%)]\tLoss: 0.412210\n",
      "Train Epoch: 2 [10880/60000 (18%)]\tLoss: 0.614302\n",
      "Train Epoch: 2 [11520/60000 (19%)]\tLoss: 0.503313\n",
      "Train Epoch: 2 [12160/60000 (20%)]\tLoss: 0.553667\n",
      "Train Epoch: 2 [12800/60000 (21%)]\tLoss: 0.450244\n",
      "Train Epoch: 2 [13440/60000 (22%)]\tLoss: 0.383460\n",
      "Train Epoch: 2 [14080/60000 (23%)]\tLoss: 0.470502\n",
      "Train Epoch: 2 [14720/60000 (25%)]\tLoss: 0.560091\n",
      "Train Epoch: 2 [15360/60000 (26%)]\tLoss: 0.374344\n",
      "Train Epoch: 2 [16000/60000 (27%)]\tLoss: 0.255930\n",
      "Train Epoch: 2 [16640/60000 (28%)]\tLoss: 0.388201\n",
      "Train Epoch: 2 [17280/60000 (29%)]\tLoss: 0.433450\n",
      "Train Epoch: 2 [17920/60000 (30%)]\tLoss: 0.397050\n",
      "Train Epoch: 2 [18560/60000 (31%)]\tLoss: 0.414670\n",
      "Train Epoch: 2 [19200/60000 (32%)]\tLoss: 0.304200\n",
      "Train Epoch: 2 [19840/60000 (33%)]\tLoss: 0.530396\n",
      "Train Epoch: 2 [20480/60000 (34%)]\tLoss: 0.397632\n",
      "Train Epoch: 2 [21120/60000 (35%)]\tLoss: 0.324461\n",
      "Train Epoch: 2 [21760/60000 (36%)]\tLoss: 0.535757\n",
      "Train Epoch: 2 [22400/60000 (37%)]\tLoss: 0.367694\n",
      "Train Epoch: 2 [23040/60000 (38%)]\tLoss: 0.323173\n",
      "Train Epoch: 2 [23680/60000 (39%)]\tLoss: 0.473619\n",
      "Train Epoch: 2 [24320/60000 (41%)]\tLoss: 0.549169\n",
      "Train Epoch: 2 [24960/60000 (42%)]\tLoss: 0.505997\n",
      "Train Epoch: 2 [25600/60000 (43%)]\tLoss: 0.428218\n",
      "Train Epoch: 2 [26240/60000 (44%)]\tLoss: 0.302517\n",
      "Train Epoch: 2 [26880/60000 (45%)]\tLoss: 0.306948\n",
      "Train Epoch: 2 [27520/60000 (46%)]\tLoss: 0.348151\n",
      "Train Epoch: 2 [28160/60000 (47%)]\tLoss: 0.353078\n",
      "Train Epoch: 2 [28800/60000 (48%)]\tLoss: 0.374726\n",
      "Train Epoch: 2 [29440/60000 (49%)]\tLoss: 0.298019\n",
      "Train Epoch: 2 [30080/60000 (50%)]\tLoss: 0.513305\n",
      "Train Epoch: 2 [30720/60000 (51%)]\tLoss: 0.495624\n",
      "Train Epoch: 2 [31360/60000 (52%)]\tLoss: 0.392436\n",
      "Train Epoch: 2 [32000/60000 (53%)]\tLoss: 0.242179\n",
      "Train Epoch: 2 [32640/60000 (54%)]\tLoss: 0.518224\n",
      "Train Epoch: 2 [33280/60000 (55%)]\tLoss: 0.274850\n",
      "Train Epoch: 2 [33920/60000 (57%)]\tLoss: 0.469633\n",
      "Train Epoch: 2 [34560/60000 (58%)]\tLoss: 0.406277\n",
      "Train Epoch: 2 [35200/60000 (59%)]\tLoss: 0.377973\n",
      "Train Epoch: 2 [35840/60000 (60%)]\tLoss: 0.263101\n",
      "Train Epoch: 2 [36480/60000 (61%)]\tLoss: 0.336818\n",
      "Train Epoch: 2 [37120/60000 (62%)]\tLoss: 0.270714\n",
      "Train Epoch: 2 [37760/60000 (63%)]\tLoss: 0.224762\n",
      "Train Epoch: 2 [38400/60000 (64%)]\tLoss: 0.379341\n",
      "Train Epoch: 2 [39040/60000 (65%)]\tLoss: 0.365165\n",
      "Train Epoch: 2 [39680/60000 (66%)]\tLoss: 0.428004\n",
      "Train Epoch: 2 [40320/60000 (67%)]\tLoss: 0.270788\n",
      "Train Epoch: 2 [40960/60000 (68%)]\tLoss: 0.382473\n",
      "Train Epoch: 2 [41600/60000 (69%)]\tLoss: 0.330318\n",
      "Train Epoch: 2 [42240/60000 (70%)]\tLoss: 0.683049\n",
      "Train Epoch: 2 [42880/60000 (71%)]\tLoss: 0.296373\n",
      "Train Epoch: 2 [43520/60000 (72%)]\tLoss: 0.329058\n",
      "Train Epoch: 2 [44160/60000 (74%)]\tLoss: 0.430304\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train Epoch: 2 [44800/60000 (75%)]\tLoss: 0.391505\n",
      "Train Epoch: 2 [45440/60000 (76%)]\tLoss: 0.446290\n",
      "Train Epoch: 2 [46080/60000 (77%)]\tLoss: 0.285082\n",
      "Train Epoch: 2 [46720/60000 (78%)]\tLoss: 0.289454\n",
      "Train Epoch: 2 [47360/60000 (79%)]\tLoss: 0.237609\n",
      "Train Epoch: 2 [48000/60000 (80%)]\tLoss: 0.336093\n",
      "Train Epoch: 2 [48640/60000 (81%)]\tLoss: 0.291317\n",
      "Train Epoch: 2 [49280/60000 (82%)]\tLoss: 0.231290\n",
      "Train Epoch: 2 [49920/60000 (83%)]\tLoss: 0.310136\n",
      "Train Epoch: 2 [50560/60000 (84%)]\tLoss: 0.341116\n",
      "Train Epoch: 2 [51200/60000 (85%)]\tLoss: 0.176783\n",
      "Train Epoch: 2 [51840/60000 (86%)]\tLoss: 0.339423\n",
      "Train Epoch: 2 [52480/60000 (87%)]\tLoss: 0.211644\n",
      "Train Epoch: 2 [53120/60000 (88%)]\tLoss: 0.205583\n",
      "Train Epoch: 2 [53760/60000 (90%)]\tLoss: 0.362560\n",
      "Train Epoch: 2 [54400/60000 (91%)]\tLoss: 0.432000\n",
      "Train Epoch: 2 [55040/60000 (92%)]\tLoss: 0.277389\n",
      "Train Epoch: 2 [55680/60000 (93%)]\tLoss: 0.398757\n",
      "Train Epoch: 2 [56320/60000 (94%)]\tLoss: 0.320891\n",
      "Train Epoch: 2 [56960/60000 (95%)]\tLoss: 0.365055\n",
      "Train Epoch: 2 [57600/60000 (96%)]\tLoss: 0.295750\n",
      "Train Epoch: 2 [58240/60000 (97%)]\tLoss: 0.277743\n",
      "Train Epoch: 2 [58880/60000 (98%)]\tLoss: 0.357400\n",
      "Train Epoch: 2 [59520/60000 (99%)]\tLoss: 0.335345\n",
      "\n",
      "Test set: Avg. loss: 0.1207, Accuracy: 9629/10000 (96%)\n",
      "\n",
      "Train Epoch: 3 [0/60000 (0%)]\tLoss: 0.244453\n",
      "Train Epoch: 3 [640/60000 (1%)]\tLoss: 0.231640\n",
      "Train Epoch: 3 [1280/60000 (2%)]\tLoss: 0.342436\n",
      "Train Epoch: 3 [1920/60000 (3%)]\tLoss: 0.359537\n",
      "Train Epoch: 3 [2560/60000 (4%)]\tLoss: 0.262180\n",
      "Train Epoch: 3 [3200/60000 (5%)]\tLoss: 0.498864\n",
      "Train Epoch: 3 [3840/60000 (6%)]\tLoss: 0.329996\n",
      "Train Epoch: 3 [4480/60000 (7%)]\tLoss: 0.356037\n",
      "Train Epoch: 3 [5120/60000 (9%)]\tLoss: 0.457238\n",
      "Train Epoch: 3 [5760/60000 (10%)]\tLoss: 0.467253\n",
      "Train Epoch: 3 [6400/60000 (11%)]\tLoss: 0.209596\n",
      "Train Epoch: 3 [7040/60000 (12%)]\tLoss: 0.385903\n",
      "Train Epoch: 3 [7680/60000 (13%)]\tLoss: 0.333103\n",
      "Train Epoch: 3 [8320/60000 (14%)]\tLoss: 0.478871\n",
      "Train Epoch: 3 [8960/60000 (15%)]\tLoss: 0.381657\n",
      "Train Epoch: 3 [9600/60000 (16%)]\tLoss: 0.317399\n",
      "Train Epoch: 3 [10240/60000 (17%)]\tLoss: 0.411282\n",
      "Train Epoch: 3 [10880/60000 (18%)]\tLoss: 0.346587\n",
      "Train Epoch: 3 [11520/60000 (19%)]\tLoss: 0.428551\n",
      "Train Epoch: 3 [12160/60000 (20%)]\tLoss: 0.304735\n",
      "Train Epoch: 3 [12800/60000 (21%)]\tLoss: 0.422290\n",
      "Train Epoch: 3 [13440/60000 (22%)]\tLoss: 0.247277\n",
      "Train Epoch: 3 [14080/60000 (23%)]\tLoss: 0.281323\n",
      "Train Epoch: 3 [14720/60000 (25%)]\tLoss: 0.247006\n",
      "Train Epoch: 3 [15360/60000 (26%)]\tLoss: 0.310422\n",
      "Train Epoch: 3 [16000/60000 (27%)]\tLoss: 0.328334\n",
      "Train Epoch: 3 [16640/60000 (28%)]\tLoss: 0.259220\n",
      "Train Epoch: 3 [17280/60000 (29%)]\tLoss: 0.297464\n",
      "Train Epoch: 3 [17920/60000 (30%)]\tLoss: 0.387556\n",
      "Train Epoch: 3 [18560/60000 (31%)]\tLoss: 0.271823\n",
      "Train Epoch: 3 [19200/60000 (32%)]\tLoss: 0.180965\n",
      "Train Epoch: 3 [19840/60000 (33%)]\tLoss: 0.314263\n",
      "Train Epoch: 3 [20480/60000 (34%)]\tLoss: 0.192824\n",
      "Train Epoch: 3 [21120/60000 (35%)]\tLoss: 0.257031\n",
      "Train Epoch: 3 [21760/60000 (36%)]\tLoss: 0.202496\n",
      "Train Epoch: 3 [22400/60000 (37%)]\tLoss: 0.445675\n",
      "Train Epoch: 3 [23040/60000 (38%)]\tLoss: 0.216229\n",
      "Train Epoch: 3 [23680/60000 (39%)]\tLoss: 0.384591\n",
      "Train Epoch: 3 [24320/60000 (41%)]\tLoss: 0.336311\n",
      "Train Epoch: 3 [24960/60000 (42%)]\tLoss: 0.278252\n",
      "Train Epoch: 3 [25600/60000 (43%)]\tLoss: 0.275578\n",
      "Train Epoch: 3 [26240/60000 (44%)]\tLoss: 0.297498\n",
      "Train Epoch: 3 [26880/60000 (45%)]\tLoss: 0.300633\n",
      "Train Epoch: 3 [27520/60000 (46%)]\tLoss: 0.413788\n",
      "Train Epoch: 3 [28160/60000 (47%)]\tLoss: 0.437655\n",
      "Train Epoch: 3 [28800/60000 (48%)]\tLoss: 0.210516\n",
      "Train Epoch: 3 [29440/60000 (49%)]\tLoss: 0.491925\n",
      "Train Epoch: 3 [30080/60000 (50%)]\tLoss: 0.220310\n",
      "Train Epoch: 3 [30720/60000 (51%)]\tLoss: 0.147255\n",
      "Train Epoch: 3 [31360/60000 (52%)]\tLoss: 0.459586\n",
      "Train Epoch: 3 [32000/60000 (53%)]\tLoss: 0.249871\n",
      "Train Epoch: 3 [32640/60000 (54%)]\tLoss: 0.461790\n",
      "Train Epoch: 3 [33280/60000 (55%)]\tLoss: 0.246710\n",
      "Train Epoch: 3 [33920/60000 (57%)]\tLoss: 0.409573\n",
      "Train Epoch: 3 [34560/60000 (58%)]\tLoss: 0.250802\n",
      "Train Epoch: 3 [35200/60000 (59%)]\tLoss: 0.354234\n",
      "Train Epoch: 3 [35840/60000 (60%)]\tLoss: 0.240054\n",
      "Train Epoch: 3 [36480/60000 (61%)]\tLoss: 0.244579\n",
      "Train Epoch: 3 [37120/60000 (62%)]\tLoss: 0.231795\n",
      "Train Epoch: 3 [37760/60000 (63%)]\tLoss: 0.145028\n",
      "Train Epoch: 3 [38400/60000 (64%)]\tLoss: 0.276643\n",
      "Train Epoch: 3 [39040/60000 (65%)]\tLoss: 0.410538\n",
      "Train Epoch: 3 [39680/60000 (66%)]\tLoss: 0.235132\n",
      "Train Epoch: 3 [40320/60000 (67%)]\tLoss: 0.278823\n",
      "Train Epoch: 3 [40960/60000 (68%)]\tLoss: 0.373513\n",
      "Train Epoch: 3 [41600/60000 (69%)]\tLoss: 0.249240\n",
      "Train Epoch: 3 [42240/60000 (70%)]\tLoss: 0.312987\n",
      "Train Epoch: 3 [42880/60000 (71%)]\tLoss: 0.400470\n",
      "Train Epoch: 3 [43520/60000 (72%)]\tLoss: 0.130749\n",
      "Train Epoch: 3 [44160/60000 (74%)]\tLoss: 0.311013\n",
      "Train Epoch: 3 [44800/60000 (75%)]\tLoss: 0.333384\n",
      "Train Epoch: 3 [45440/60000 (76%)]\tLoss: 0.265416\n",
      "Train Epoch: 3 [46080/60000 (77%)]\tLoss: 0.274905\n",
      "Train Epoch: 3 [46720/60000 (78%)]\tLoss: 0.251457\n",
      "Train Epoch: 3 [47360/60000 (79%)]\tLoss: 0.208539\n",
      "Train Epoch: 3 [48000/60000 (80%)]\tLoss: 0.260873\n",
      "Train Epoch: 3 [48640/60000 (81%)]\tLoss: 0.345950\n",
      "Train Epoch: 3 [49280/60000 (82%)]\tLoss: 0.213814\n",
      "Train Epoch: 3 [49920/60000 (83%)]\tLoss: 0.229849\n",
      "Train Epoch: 3 [50560/60000 (84%)]\tLoss: 0.354912\n",
      "Train Epoch: 3 [51200/60000 (85%)]\tLoss: 0.425813\n",
      "Train Epoch: 3 [51840/60000 (86%)]\tLoss: 0.333643\n",
      "Train Epoch: 3 [52480/60000 (87%)]\tLoss: 0.321317\n",
      "Train Epoch: 3 [53120/60000 (88%)]\tLoss: 0.208381\n",
      "Train Epoch: 3 [53760/60000 (90%)]\tLoss: 0.207121\n",
      "Train Epoch: 3 [54400/60000 (91%)]\tLoss: 0.215106\n",
      "Train Epoch: 3 [55040/60000 (92%)]\tLoss: 0.228943\n",
      "Train Epoch: 3 [55680/60000 (93%)]\tLoss: 0.140852\n",
      "Train Epoch: 3 [56320/60000 (94%)]\tLoss: 0.188314\n",
      "Train Epoch: 3 [56960/60000 (95%)]\tLoss: 0.270637\n",
      "Train Epoch: 3 [57600/60000 (96%)]\tLoss: 0.344938\n",
      "Train Epoch: 3 [58240/60000 (97%)]\tLoss: 0.361159\n",
      "Train Epoch: 3 [58880/60000 (98%)]\tLoss: 0.197478\n",
      "Train Epoch: 3 [59520/60000 (99%)]\tLoss: 0.307263\n",
      "\n",
      "Test set: Avg. loss: 0.0950, Accuracy: 9701/10000 (97%)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "import torch.optim as optim\n",
    "\n",
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Net, self).__init__()\n",
    "        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)\n",
    "        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)\n",
    "        self.conv2_drop = nn.Dropout2d()\n",
    "        self.fc1 = nn.Linear(320, 50)\n",
    "        self.fc2 = nn.Linear(50, 10)\n",
    "    def forward(self, x):\n",
    "        x = F.relu(F.max_pool2d(self.conv1(x), 2))\n",
    "        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))\n",
    "        x = x.view(-1, 320)\n",
    "        x = F.relu(self.fc1(x))\n",
    "        x = F.dropout(x, training=self.training)\n",
    "        x = self.fc2(x)\n",
    "        return F.log_softmax(x)\n",
    "\n",
    "network = Net()\n",
    "optimizer = optim.SGD(network.parameters(), lr=learning_rate,\n",
    "                      momentum=momentum)\n",
    "\n",
    "train_losses = []\n",
    "train_counter = []\n",
    "test_losses = []\n",
    "test_counter = [i*len(train_loader.dataset) for i in range(n_epochs + 1)]\n",
    "\n",
    "def train(epoch):\n",
    "  network.train()\n",
    "  for batch_idx, (data, target) in enumerate(train_loader):\n",
    "    optimizer.zero_grad()\n",
    "    output = network(data)\n",
    "    loss = F.nll_loss(output, target)\n",
    "    loss.backward()\n",
    "    optimizer.step()\n",
    "    if batch_idx % log_interval == 0:\n",
    "      print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format(\n",
    "        epoch, batch_idx * len(data), len(train_loader.dataset),\n",
    "        100. * batch_idx / len(train_loader), loss.item()))\n",
    "      train_losses.append(loss.item())\n",
    "      train_counter.append(\n",
    "        (batch_idx*64) + ((epoch-1)*len(train_loader.dataset)))\n",
    "      torch.save(network.state_dict(), './model.pth')\n",
    "      torch.save(optimizer.state_dict(), './optimizer.pth')\n",
    "\n",
    "def test():\n",
    "  network.eval()\n",
    "  test_loss = 0\n",
    "  correct = 0\n",
    "  with torch.no_grad():\n",
    "    for data, target in test_loader:\n",
    "      output = network(data)\n",
    "      test_loss += F.nll_loss(output, target, size_average=False).item()\n",
    "      pred = output.data.max(1, keepdim=True)[1]\n",
    "      correct += pred.eq(target.data.view_as(pred)).sum()\n",
    "  test_loss /= len(test_loader.dataset)\n",
    "  test_losses.append(test_loss)\n",
    "  print('\\nTest set: Avg. loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\\n'.format(\n",
    "    test_loss, correct, len(test_loader.dataset),\n",
    "    100. * correct / len(test_loader.dataset)))\n",
    "\n",
    "\n",
    "test()\n",
    "for epoch in range(1, n_epochs + 1):\n",
    "  train(epoch)\n",
    "  test()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "authentic-superintendent",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABJvUlEQVR4nO2dd3gc1dX/P0dyr3I3tsANbIObDALTMaG3kAQIxRAg4ccDpvuFBMKbhJckJCFvIC+Y4EBCCXFooSYQIBQHCGCwiHHBNhjbsuWGq9z7/f1x5jKz693VSN7VSqvzeZ59ZnZ2ytlZ6X7nnHPvueKcwzAMw2i6FOXbAMMwDCO/mBAYhmE0cUwIDMMwmjgmBIZhGE0cEwLDMIwmTrN8G1Bbunbt6vr27ZtvMwzDMBoVFRUVK51z3VJ91uiEoG/fvkyZMiXfZhiGYTQqRKQy3WcWGjIMw2jimBAYhmE0cUwIDMMwmjiNLkdgGEZhsX37dqqqqtiyZUu+TSkIWrVqRWlpKc2bN499jAmBYRh5paqqivbt29O3b19EJN/mNGqcc6xatYqqqir69esX+zgLDRmGkVe2bNlCly5dTASygIjQpUuXWntXTUMIJk6Evn2hqEiXEyfm2yLDMCKYCGSPutzLwheCiRPh8suhshKcY2PlCv743XfZ/PAT+bbMMAyjQVD4QnDrrbBpEwBf0o0ypnLZtvt56MaZeTbMMIyGwKpVqygrK6OsrIyePXvSu3fvr95v27Yt47FTpkzh2muvrdX1+vbty8qVK/fE5KxT+MnihQsB2EkRF/AXqigFYNLq4VyVT7sMw2gQdOnShalTpwJw22230a5dO2688cavPt+xYwfNmqVuKsvLyykvL68PM3NK4XsE++wDwMNcyhscz3iu5mIeYVLR19i1K8+2GYbRILnkkksYN24cxx57LD/4wQ/48MMPOfzwwxk5ciSHH344c+bMAWDSpEmcfvrpgIrId7/7XUaPHk3//v255557Yl+vsrKS4447juHDh3PcccexMHiAffrppxk6dCgjRozg6KOPBmDmzJkccsghlJWVMXz4cD7//PM9/r6F7xH8/Odw+eVcvOlR2rGBc3mS4hbNeHTbJXz6KQwdmm8DDcPwXH89BA/nWaOsDH7729of99lnn/H6669TXFzMunXrePvtt2nWrBmvv/46P/zhD3nmmWd2O2b27Nm89dZbrF+/nkGDBnHllVfG6s9/9dVX853vfIeLL76Yhx56iGuvvZbnn3+e22+/nVdffZXevXuzdu1aACZMmMB1113HmDFj2LZtGzt37qz9l0ui8D2CMWPggQdo3qc358lTSJ8+HHvnKYhoDnnp0nwbaBhGQ+Scc86huLgYgOrqas455xyGDh3KDTfcwMyZqXOMp512Gi1btqRr1650796d5cuXx7rW+++/zwUXXADARRddxLvvvgvAEUccwSWXXMKDDz74VYN/2GGHcccdd/CrX/2KyspKWrduvadftQl4BKBiMGbMV2/7ABO7w6WXwh13wL335s80wzBC6vLknivatm371fqPfvQjjj32WJ577jkWLFjA6NGjUx7TsmXLr9aLi4vZsWNHna7tu4BOmDCByZMn89JLL1FWVsbUqVO54IILGDVqFC+99BInnXQSf/jDH/ja175Wp+t4Ct8jSMP558Pxx8Orr+bbEsMwGjrV1dX07t0bgEceeSTr5z/88MN54gnt0j5x4kSOPPJIAL744gtGjRrF7bffTteuXVm0aBHz5s2jf//+XHvttXz9619n2rRpe3z9JisEACeeCJ9/DvPn59sSwzAaMt///ve55ZZbOOKII7ISkx8+fDilpaWUlpYybtw47rnnHh5++GGGDx/OY489xv/93/8BcNNNNzFs2DCGDh3K0UcfzYgRI3jyyScZOnQoZWVlzJ49m+985zt7bI845/b4JPVJeXm5y9bENHPmwODBMHYs/PSn8MorsGIFXHddVk5vGEYMZs2axf77759vMwqKVPdURCqccyn7ujaNHEEaBg6E0aPhd7+Dd96B6dN1uwmBYRhNiSYdGhKBN9+Exx8PRQBgzZr82WQYhlHfNGkhABWD886D738fRo7UbcFYEcMwjCZBkxcCz69+BUHS3oTAMIwmhQlBhH79oHlzmD0735YYhmHUHyYEEZo3hwEDTAgMw2haNOleQ6kYPNiEwDCaEqtWreK4444DYNmyZRQXF9OtWzcAPvzwQ1q0aJHx+EmTJtGiRQsOP/zw3T575JFHmDJlCuPHj8++4VnEhCCJffaBt97KtxWGYdQXNZWhrolJkybRrl27lELQWLDQUBIlJVBdDVkYPGgYRi6oh6lnKyoqOOaYYzjooIM46aSTWBpUp7znnns44IADGD58OOeddx4LFixgwoQJ3H333ZSVlfHOO+/EOv9dd93F0KFDGTp0KL8NCixt3LiR0047jREjRjB06FCefPJJAG6++eavrlkbgaoN5hEk0amTLtetC9cNw2gg+Klng1kHqazU95BQWHJPcM5xzTXX8MILL9CtWzeefPJJbr31Vh566CF++ctfMn/+fFq2bMnatWspKSnhiiuuqJUXUVFRwcMPP8zkyZNxzjFq1CiOOeYY5s2bR69evXjppZcArW+0evVqnnvuOWbPno2IfFWKOtuYR5BESYkuc3S/DcPYEyJTz37Fpk26PUts3bqVGTNmcMIJJ1BWVsbPfvYzqqqqAK0RNGbMGP785z+nnbWsJt59912++c1v0rZtW9q1a8e3vvUt3nnnHYYNG8brr7/OD37wA9555x06duxIhw4daNWqFZdddhnPPvssbdq0ydr3jGJCkIQJgWE0YIKZu2JvrwPOOYYMGcLUqVOZOnUq06dP57XXXgPgpZde4qqrrqKiooKDDjqoTmWm09V3GzhwIBUVFQwbNoxbbrmF22+/nWbNmvHhhx9y1lln8fzzz3PyySfv0XdLhwlBEiYEhtGACaaejb29DrRs2ZIVK1bw/vvvA7B9+3ZmzpzJrl27WLRoEcceeyx33nkna9euZcOGDbRv357169fHPv/RRx/N888/z6ZNm9i4cSPPPfccRx11FEuWLKFNmzZceOGF3HjjjXz88cds2LCB6upqTj31VH77299+ldTONpYjSMILwZIlMHkyjBqVV3MMw4gSTD2bEB5q00a3Z4mioiL++te/cu2111JdXc2OHTu4/vrrGThwIBdeeCHV1dU457jhhhsoKSnhjDPO4Oyzz+aFF17g3nvv5aijjko43yOPPMLzzz//1fsPPviASy65hEMOOQSAyy67jJEjR/Lqq69y0003UVRURPPmzbn//vtZv349Z555Jlu2bME5x91335217xmlSZehTkVlpXZEGDkSPvlEp7Ls3j1nlzOMJk+ty1BPnKg5gYUL1RP4+c+zliguFKwM9R7iPYLp02HXLvjiCxMCw2hQJE09a+w5liNIon17rUjqc0Dz5uXXHsMwjFyTMyEQkb1F5C0RmSUiM0Vkt+leRLlHROaKyDQROTBX9sSlqAg6dgzfmxAYRu5pbCHqhkxd7mUuPYIdwH855/YHDgWuEpEDkvY5BdgveF0O3J9De2IT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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "plt.plot(train_counter, train_losses, color='blue')\n",
    "plt.scatter(test_counter, test_losses, color='red')\n",
    "plt.legend(['Train Loss', 'Test Loss'], loc='upper right')\n",
    "plt.xlabel('number of training examples seen')\n",
    "plt.ylabel('negative log likelihood loss')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
